//
//  MultiplayerSwitcher.swift
//  BusinessToolkit
//
//  Created by JY_NEW on 2021/11/2.
//

import Foundation

/// 多人控制状态
public class BTMultiplayerState {
    private let enterAction: () -> Void
    private let exitAction: () -> Void
    /// 是否已进入状态
    public var isEnterd: Bool = false
    /// 用于存放状态切换标记
    private var currentFlags: [Int] = []
    
    private var __creatableFlag = Int.max
    /// 创建自动生成的标志，自动规则为从Int.max递减
    public func createFlag() -> Int {
        __creatableFlag -= 1
        return __creatableFlag
    }
    
    public init(enter: @escaping () -> Void, exit: @escaping () -> Void) {
        self.enterAction = enter
        self.exitAction = exit
    }
    /// 不通过标志直接执行进入操作，会使之前的标志调用失效
    public func enter() {
        self.currentFlags.removeAll()
        self.isEnterd = true
        self.enterAction()
    }
    /// 不通过标志直接执行退出操作，会使之前的标志全部失效
    public func exit() {
        self.currentFlags.removeAll()
        self.isEnterd = false
        self.exitAction()
    }
    /// 使用标志进入状态(若已在状态则不会真正执行进入操作)，退出时用同一标志，当所有进入标志都退出后才会真正退出
    public func enter(for flag: Int) {
        if !self.currentFlags.contains(flag) {
            self.currentFlags.append(flag)
            if !self.isEnterd {
                self.enterAction()
            }
        }
    }
    /// 使用标志退出，当所有进入标志都退出后才会真正执行退出操作
    public func exit(for flag: Int) {
        if let idx = self.currentFlags.firstIndex(of: flag) {
            self.currentFlags.remove(at: idx)
            if self.currentFlags.count == 0 {
                if self.isEnterd {
                    self.exitAction()
                }
            }
        }
    }
}
